package simple.array;

import java.util.Arrays;

/**
 * <a href="https://leetcode.cn/problems/relative-sort-array/">1122. 数组的相对排序</a>
 * 给你两个数组，arr1 和 arr2，arr2 中的元素各不相同，arr2 中的每个元素都出现在 arr1 中。
 * 对 arr1 中的元素进行排序，使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。
 * 示例 1：
 *   输入：arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
 *   输出：[2,2,2,1,4,3,3,9,6,7,19]
 * 示例  2:
 *   输入：arr1 = [28,6,22,8,44,17], arr2 = [22,28,8,6]
 *   输出：[22,28,8,6,17,44]
 * 提示：
 *   1 <= arr1.length, arr2.length <= 1000
 *   0 <= arr1[i], arr2[i] <= 1000
 *   arr2 中的元素 arr2[i]  各不相同
 *   arr2 中的每个元素 arr2[i] 都出现在 arr1 中
 * @author 刘学松
 * @date 2023-07-19 10:11
 */
public class 数组的相对排序 {
    public int[] relativeSortArray(int[] arr1, int[] arr2) {
        int l = 0, r = 1, length = arr1.length;
        for (int val : arr2) {
            while (arr1[l] == val) {
                ++l;
            }
            r = l+1;
            while (r < length) {
                if (arr1[r] == val) {
                    swap(arr1, r, l);
                    ++r;
                    ++l;
                } else {
                    ++r;
                }
            }
        }
        Arrays.sort(arr1, l, length);
        return arr1;
    }

    public void swap(int[] arr, int a, int b) {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }

    public int[] relativeSortArray1(int[] arr1, int[] arr2) {
        int[] ans = new int[arr1.length];
        int[] cnt = new int[1001];
        for (int val : arr2) {
            ++cnt[val];
        }
        int start = 0;
        for (int val : arr2) {
            int count = cnt[val];
            while (count > 0) {
                ans[start++] = val;
                --count;
            }
        }
        for (int i = 0; i < 1001; i++) {
            int count = cnt[i];
            while (count > 0) {
                ans[start++] = i;
                --count;
            }
        }
        return ans;
    }
}
